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 장 에 대한 총 결 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.