Objective-C tips

12473 단어
Objective-C tips
nil
다음 두 가지 OC 문법 은 등가 이다.
if (venue == nil) {
    [organizer remindToFindVenueForParty];
}
if (!venue) {  //  JS   ,         
    [organizer remindToFindVenueForParty];
}

다른 언어 는 항상 비 어 있 는 판단 을 해 야 한다. JAVA JS 와 같이 필요 하고 빈 포인터 이상 이 발생 하지 않도록 해 야 한다. OC 에 서 는 아래 와 같이 판단 할 필요 가 없다. 대상 이 nil 이면 OC 는 호출 된 방법 을 직접 무시 할 것 이다.
// Is venue non-nil?
if (venue) { //  JS,       
    [venue sendConfirmation];
}

@
문자열 생 성 대상:
NSString *myString = @"Hello, World!";

NSLog 에서 문자열 을 포맷 합 니 다. 종류 에 따라 자리 표시 자 를 사용 합 니 다.
int a = 1;
float b = 2.5;
char c = 'A';
NSLog(@"Integer: %d Float: %f Char: %c", a, b, c);

        
NSString *str = @"hello oc";
NSLog(@"print %@", str);
%@ 'a pointer to any object' 를 대표 하 며 대상 이 Log 되 었 을 때 대상 description 에 게 메 시 지 를 보 내 문자열 을 되 돌려 줍 니 다.자바 의 toString () 방법 과 같 습 니 다.
인 스 턴 스 변수 set & get 방법
헤더 파일 에서 인 스 턴 스 변 수 를 설명 합 니 다. ANDROID 에서 인 스 턴 스 변 수 는 m 로 시작 하고 OC 에서 인 스 턴 스 변 수 는 _ 로 시작 합 니 다. 약속 일 뿐 필요 한 것 이 아 닙 니 다.get 방법 은 get 로 시작 할 필요 가 없습니다.
#import 

@interface BKItem : NSObject
{
    NSString *_itemName; //*         
    NSString *_serialNumber;
    int _valueInDollars;
    NSDate *_dateCreated;
}

//       set get  ,  java          
- (void)setItemName:(NSString *)str;
- (NSString *)itemName;

- (void)setSerialNumber:(NSString *)str;
- (NSString *)serialNumber;

- (void)setValueInDollars:(int)v;
- (int)valueInDollars;

- (NSDate *)dateCreated; //  get  

@end

클래스 구현 중 set get 방법:
#import "BKItem.h"

@implementation BKItem

- (void)setItemName:(NSString *)str
{
    _itemName = str;
}
- (NSString *)itemName
{
    return _itemName;
}

- (void)setSerialNumber:(NSString *)str
{
    _serialNumber = str;
}
- (NSString *)serialNumber
{
    return _serialNumber;
}

- (void)setValueInDollars:(int)v
{
    _valueInDollars = v;
}
- (int)valueInDollars
{
    return _valueInDollars;
}

- (NSDate *)dateCreated
{
    return _dateCreated;
}

@end


set get 의 두 가지 방문 문법 은 점 문법 을 사용 하면 컴 파일 러 에 의 해 첫 번 째 방법 으로 바 뀌 지만 점 문법 을 사용 하 는 것 이 더욱 편리 합 니 다.
        BKItem *item = [[BKItem alloc] init];
        [item setItemName:@"Red Sofa"];
        [item setSerialNumber:@"A1B2C"];
        [item setValueInDollars:100];
        
        NSLog(@"%@ %@ %@ %d", [item itemName], [item dateCreated],
              [item serialNumber], [item valueInDollars]);
        
       //            dot syntax:      set  ,      get  
        item.itemName=@"Red Sofa";
        item.serialNumber=@"A1B2C";
        item.valueInDollars = 100;
        NSLog(@"%@ %@ %@ %d", item.itemName, item.dateCreated,
              item.serialNumber, item.valueInDollars);

재 작성 방법
부모 클래스 를 다시 쓰 는 방법 은 하위 클래스 의 실현 파일 에 만 다시 쓰 면 됩 니 다. 헤더 파일 에 서 는 설명 이 필요 없습니다. 다시 쓰 는 방법 은 부모 클래스 의 헤더 파일 에 의 해 설명 되 었 기 때 문 입 니 다.
Initializers
구조 기, 클래스 는 기본적으로 init 의 초기 화 방법 만 있 고 사용자 정의 초기 화 방법 을 추가 할 수 있 습 니 다.
#import 

@interface BKItem : NSObject
{
    NSString *_itemName; //*         
    NSString *_serialNumber;
    int _valueInDollars;
    NSDate *_dateCreated;
}

//            
- (instancetype)initWithItemName:(NSString *)name valueInDollars:(int) value serialNumber:(NSString *)sNumber;
- (instancetype)initWithItemName:(NSString *)name;

@end

헤더 파일 에서 설명 하 는 초기 화 방법 을 실현 합 니 다. 보통 매개 변수 가 가장 많은 초기 화 방법 은 초기 화 방법 (designated initializer) instancetype 키 워드 를 초기 화 방법의 반환 형식 으로 지정 하 는 것 입 니 다. 누가 초기 화 방법 을 호출 하 는 지 instancetype 가 누구 (an instance of the receiving object) 입 니 다.
#import "BKItem.h"

@implementation BKItem

// Designated initializer (      ,          init  )
- (instancetype)initWithItemName:(NSString *)name valueInDollars:(int) value serialNumber:(NSString *)sNumber{
    // Call the superclass's designated initializer
    self = [super init];
    // Did the superclass's designated initializer succeed?
    if (self) { //       ,  JS  
        // Give the instance variables initial values
        _itemName = name;
        _serialNumber = sNumber;
        _valueInDollars = value;
        // Set _dateCreated to the current date and time
        _dateCreated = [[NSDate alloc] init];
    }
    // Return the address of the newly initialized object
    return self;
}
- (instancetype)initWithItemName:(NSString *)name{
    return [self initWithItemName:name
                   valueInDollars:0
                     serialNumber:@""];
}

//      init  ,     designated initializer
- (instancetype)init
{
    return [self initWithItemName:@"Item"];
}

//      description  
- (NSString *)description
{
    NSString *descriptionString =
    [[NSString alloc] initWithFormat:@"%@ (%@): Worth $%d, recorded on %@",
     self.itemName,
     self.serialNumber,
     self.valueInDollars,
     self.dateCreated];
    return descriptionString;
}

@end

id - a pointer to any object
Because id is defined as “a pointer to any object,” you do not include an * when declaring avariable or method parameter of this type.
변 수 를 id 로 설명 할 때 포인터 이기 때문에 * 번 호 를 추가 할 필요 가 없습니다.
Class method 클래스 방법 (정적 방법)
클래스 방법 은 대상 인 스 턴 스 를 만 들 거나 전역 속성 을 가 져 오 는 데 자주 사 용 됩 니 다.클래스 방법 은 인 스 턴 스 변수 (instance variables) 에 접근 할 수 없습니다.+ 호 를 통 해 유형 방법 을 성명 하 다.
헤더 파일 에서 클래스 방법 을 설명 하고 헤더 파일 내용 의 순 서 를 주의 하 십시오: instance variable, class method, initializer, instance method.
#import 

@interface BKItem : NSObject
{
    NSString *_itemName; //*         
    NSString *_serialNumber;
    int _valueInDollars;
    NSDate *_dateCreated;
}

+ (instancetype)randomItem; //   

- (instancetype)initWithItemName:(NSString *)name valueInDollars:(int) value serialNumber:(NSString *)sNumber;
- (instancetype)initWithItemName:(NSString *)name;

@end

실행 파일 에서 클래스 구현 방법:
#import "BKItem.h"

@implementation BKItem

+ (instancetype)randomItem
{
    // Create an immutable array of three adjectives
    NSArray *randomAdjectiveList = @[@"Fluffy", @"Rusty", @"Shiny"];
    // Create an immutable array of three nouns
    NSArray *randomNounList = @[@"Bear", @"Spork", @"Mac"];
    // Get the index of a random adjective/noun from the lists
    // Note: The % operator, called the modulo operator, gives
    // you the remainder. So adjectiveIndex is a random number
    // from 0 to 2 inclusive.
    NSInteger adjectiveIndex = arc4random() % [randomAdjectiveList count];
    NSInteger nounIndex = arc4random() % [randomNounList count];
    // Note that NSInteger is not an object, but a type definition
    // for "long"
    NSString *randomName = [NSString stringWithFormat:@"%@ %@",
                            [randomAdjectiveList objectAtIndex:adjectiveIndex],
                            [randomNounList objectAtIndex:nounIndex]];
    int randomValue = arc4random() % 100;
    NSString *randomSerialNumber = [NSString stringWithFormat:@"%c%c%c%c%c",
                                    '0' + arc4random() % 10,
                                    'A' + arc4random() % 26,
                                    '0' + arc4random() % 10,
                                    'A' + arc4random() % 26,
                                    '0' + arc4random() % 10];
    BKItem *newItem = [[self alloc] initWithItemName:randomName
                                       valueInDollars:randomValue
                                         serialNumber:randomSerialNumber];
    return newItem;
}

@end

NSArray NSMutableArray
Objective - C 에서 같은 배열 은 임의의 유형의 대상 을 포함 할 수 있 지만 Objective - C 의 대상 이 어야 하 며 기본 유형 과 C struct 가 될 수 없습니다.nil 을 배열 에 추가 할 수 는 없 지만 NSNull 은 가능 합 니 다.
NSMutableArray *items = [[NSMutableArray alloc] init];
[items addObject:nil]; //ERROR -[__NSArrayM insertObject:atIndex:]: object cannot be nil
[items addObject:[NSNull null]]; // this is OK

배열 아래 표 시 된 접근, 다음 두 가지 방법 은 등가 입 니 다.
NSString *str = [items objectAtIndex:0];
NSString *rts = items[0];

isa instance variable
대상 마다 하나의 isa 인 스 턴 스 변수 포인터 가 있 고 대상 이 속 한 종 류 를 가리킨다.
Exception
 // id         ,  JAVA  Object
id lastObj = [items lastObject];
[lastObj count];

lastObj 에 count 방법 이 없 으 면 다음 과 같은 오 류 를 보고 합 니 다.
2015-07-07 19:31:16.787 RandomItems[3647:303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[BKItem count]: unrecognized selector sent to instance 0x7fd1a2c0c650'

unrecognized selector, selector 는 message 이 고 클래스 의 방법 입 니 다.-[BKItem count], - receiver 는 BKitem 의 인 스 턴 스 이 고 + 라면 receiver 는 BKitem class 입 니 다.
아 날로 그 접두사
OC 에는 가방 이나 네 임 스페이스 라 는 개념 이 없습니다.NS -- 넥 스 트 스텝, 애플 이 인수 한 회사
Strong and Weak References
두 대상 이 모두 상대방 을 인용 하고 강 한 인용 을 한다 면 메모리 누 출 이 발생 할 수 있다.약 한 인용 을 통 해 이 문 제 를 해결 할 수 있다. 보통 두 대상 이 서로 상대방 을 인용 할 때 이 두 대상 은 부자 관계 가 존재 하고 아버지 대상 은 아들 대상 을 강하 게 인용 하 며 아들 대상 은 아버지 대상 을 약 하 게 인용 해 야 한다.
//         
__weak BNRItem *_container;

@property
이전에 모든 인 스 턴 스 변 수 를 설명 할 때 대응 하 는 set get 방법 을 써 야 합 니 다. property 를 통 해 set get 방법 을 쓰 지 않 아 도 됩 니 다. 컴 파일 러 는 인 스 턴 스 변수 와 set get 접근 방법 을 설명 합 니 다.
@property NSString *itemName;

다음 표 는 @ property 를 사용 할 지 여부 의 차이 입 니 다.
file
Without properties
With properties
BNRThing.h
@interface BNRThing : NSObject{NSString *_name;}- (void)setName:(NSString *)n;- (NSString *)name;@end
@interface BNRThing : NSObject@property NSString *name;@end
BNRThing.m
@implementation BNRThing- (void)setName:(NSString *)n{_name = n;}- (NSString *)name{return _name;}@end
@implementation BNRThing@end
property 속성 이름 밑줄 접두사 필요 없습니다.
property attribute (이 두 단 어 는 재 미 있 습 니 다. 모두 속성 으로 번역 할 수 있 습 니 다.)
@property (nonatomic, readwrite, strong) NSString *itemName;
nonatomic, atomic 기본 값 은 atomic 이 고 다 중 스 레 드 와 관련 된 attribute (원자의, 즉 스 레 드 안전, 비 원자, 즉 비 스 레 드 안전, 성능 이 더욱 높 음) 입 니 다. iOS 에 서 는 보통 nonatomic 을 사용 합 니 다.readwrite, readonly 기본 값 은 readwrite 이 고 컴 파일 러 에 set 방법 을 생 성 하 는 지 알려 주 며 set 방법 만 읽 고 생 성 하지 않 습 니 다.strong, weak, copy, unsafe_unretained OC 대상 에 대한 기본 값 은 strong 입 니 다.OC 가 아 닌 대상 (예 를 들 어 기본 형식) 이 라면 선택 가능 한 값 unsafe-unretained 만 있 고 OC 대상 이 아 닌 기본 값 이기 때문에 설명 하지 않 아 도 됩 니 다.
언제 써 요?설명 할 변수 형식 에 가 변 적 인 하위 클래스 가 있 을 때, 예 를 들 어 NSString / NSMutableString 또는 NSArray / NSMutableSArray 를 사용 하려 면 copy 를 사용 해 야 합 니 다. 생 성 된 최종 코드 는 다음 과 같 습 니 다. copy 는 대상 을 복사 하고 변 수 를 복사 생 성 된 대상 에 강하 게 참조 합 니 다.
- (void)setItemName:(NSString *)itemName
{
    _itemName = [itemName copy];
}
@property (nonatomic, strong) BNRItem *containedItem;
@property (nonatomic, weak) BNRItem *container;
@property (nonatomic, copy) NSString *itemName;
@property (nonatomic, copy) NSString *serialNumber;
@property (nonatomic) int valueInDollars;
@property (nonatomic, readonly, strong) NSDate *dateCreated;

The memory management attribute’s values are strong, weak, copy, and unsafe_unretained. This attribute describes the type of reference that the object with the instance variable has to the object that the variable is pointing to.
위의 두 번 째 말 은 어떻게 이해 합 니까?많은 그...
사용자 정의 set get 방법
set get 방법 에 논리 가 있 을 때 클래스 구현 파일 에 사용자 정의 set get 방법 을 추가 해 야 합 니 다.
- (void)setContainedItem:(BNRItem *)containedItem
{
    _containedItem = containedItem;
    self.containedItem.container = self;
}

set get 방법 을 동시에 실현 했다 면 헤더 파일 에 인 스 턴 스 변 수 를 설명 해 야 합 니 다. copy 인 스 턴 스 변 수 를 자동 으로 추가 하지 않 습 니 다.
본 고 는 《 iOS Programming The Big Nerd Ranch Guide 4th Edition 》 제2, 3 장 에 대한 총 결 이다.

좋은 웹페이지 즐겨찾기