Programming with Objective-C(1)
4334 단어 iosObjective-CiOS-OC
지금 보고 있는 것은 Programming with Objective-C이고, 현재 Working with Objects가 보인다.
대상을 말하자면 사실은 대상을 향한 개념과 관련이 있는데 OC는 대상을 향한 언어로서 OC의 개발은 자연히 대상을 향한 것과 관계를 끊을 수 없다.대상을 향한 세계에서 만물은 모두 대상이고 대상 간에 소식을 통해 소통된다고 할 수 있다.그래서 OC에 있어 이른바 함수는 사실 메시지이다. 함수의 호출은 메시지를 보내는 것이고 함수의 실현은 메시지를 받아들이는 것이다.이 관련 문법은 사실 매우 간단하기 때문에 토론을 많이 하지 않는다.
대상에 대해 말하자면 지침을 피할 수 없다. 왜냐하면 대상이 저장되어 있기 때문에 반드시 어떤 물건이 기록되어 우리가 그것을 거슬러 올라갈 수 있게 해야 한다.OC에서 바늘로 대상을 거슬러 올라가는 점은 C와 차이가 많지 않다.하지만 여기서 언급해야 할 점이 하나 있다. 바로 대상의 생존 주기다.국부 변수에 대해 우리는 모두 알고 있다. 그 생존 주기는 코드 블록에 달려 있고, 코드 블록을 초과하면 소각되지만, 대상이 다르면 그 성명 주기는 약간 길어진다.예를 들어 우리는 하나의 코드 블록에 지침을 성명했다. 현대 코드 블록의 실행이 끝날 때 이 지침은 소각되었다. 그러나 주의해야 할 것은 이 지침이 가리키는 대상은 사실 아직도 존재한다는 것이다.여기서 약간의 의혹이 있을 수 있습니다. 주로 지침과 대상을 구분해야 합니다. 지침은 대상이고 분배할 때 창고에 존재합니다. (물론 여기는 국부적인 것을 가리킨다) 창설할 때 성명만 하면 됩니다.그러나 대상은 다르다. 대상의 창설은 메모리의 분배, 속성의 초기화와 관련된다. 그리고 우리는 대상을 얻는다. 이 과정은 무더기 위에서 이루어진 것이다.바늘과 대상 간의 연관성은 단지 바늘이 대상에 대응하는 주소를 저장했다고 말할 뿐이다.그래서 코드 블록이 실행되면 바늘이 풀리지만 대상은 존재한다.이렇게 하는 의미는 현대 블록이 실행된 후에 대상은 일정한 역할을 해야 한다는 데 있다. 예를 들어 함수는 한 대상을 되돌려주고 이 대상의 속성을 다른 대상에게 복제한다. 즉, 깊은 복제를 취할 때이다.이런 상황에서 국부적으로 발생하는 대상은 코드 블록에 따라 방출될 수 없다.그럼 대상은 도대체 어떻게 풀어주는 거예요?이것은 ARC에 맡겨서 해결할 수 있습니다.그러면 앞에서 언급한 대상과 지침의 관계에 따라 지침은 하나의 변수이기 때문에 함수 내부에서 외부에서 하나의 대상을 전달해야 한다면 우리는 지침을 통해 완성할 수 있다.
함수 내부의 대상을 고려하면 사실 함수 내부에는 두 개의 은밀한 대상이 있다.우선self, 이 대상이 가리키는 것은 정보를 받아들이는 대상이다.바로 이러한 점을 바탕으로 어떤 종류를 작성할 때 우리는 다음과 같은 같은 같은 기능을 빼내는 것을 고려할 수 있다.
@implementation
- (void)sayHello() {
[self saySomething:@"Hello, world!"];
}
- (void)saySomething() {
NSLog("%@", greeting);
}
이렇게 코드를 쓰면 우리는 많은 다른 방법을 실현할 수 있다. 예를 들어sayHello, 예를 들어sayGoodbye 등이다. 그러나 실질적으로 그들은 문자열만 출력할 뿐이다. 문자열의 내용만 다르면 우리는 출력의 기능을 단독으로 추출한 다음에 다른 메시지 내부에 서로 다른 문자열을 써서 보내면 된다. 만약에 이런 방법의 기능이 변경된다면그럼 우리도 saySomething만 변경하면 돼.
또 다른 은밀한 바늘은 슈퍼입니다. 이 바늘은 현재 클래스의 부류를 가리키는 데 사용됩니다.슈퍼 클래스를 도입한 후에 하위 클래스와 부 클래스 중의 일부 속성, 더 나아가 함수까지 모두 공용할 수 있음을 의미한다.이곳의 공용은 클래스 내부의 공용이 아니라 두 개의 클래스를 직접 뛰어넘어 사용할 수 있고 위의 코드를 예로 삼을 수 있다.위의 코드는 우리가 Person 클래스의 방법으로 간주하고 그 다음에 우리는 또 다른 클래스, 예를 들어 Woman 클래스를 필요로 한다. 그리고say Something에서 우리는 모든 출력을 대문자로 만든다.그러면 woman 대상에게sayHello 메시지를 보낼 때 출력하는 것은 대문자 문자열입니다.물론, 여기에 또 하나의 번거로운 점이 있다. 만약 우리가 출력된 문자에 대해 수정이 필요하다면, 두 종류 모두 수정해야 한다.그러면 슈퍼 키워드가 생기면 내가 곧 보낼 메시지가 부류에 발송될 것을 확신할 수 있고 기본 기능을 부류에 맡겨 실현할 수 있다.예를 들어 부류의saySomething이 실현하는 것은 단순한 문자열의 출력이다. 그러면 부류가 문자열에 대한 추가 처리, 예를 들어 대문자로 바꾸는 것이다. 내가 변환한 후에 슈퍼 키워드를 통해 부류의saySomething을 호출하면 된다.이렇게 해서 만약에 전체 Person의 출력에 어떤 변화가 있다면 우리가 필요로 하는 것은 Person의saySomething을 바꾸는 것일 뿐이고 하위 클래스 기능이 영향을 받지 않도록 보장할 수 있다.
this와 슈퍼에 대해 이야기하면 OC의 대상을 언급할 필요가 있다.OC의 객체는 동적으로 작성되며 작성 프로세스는 기본적으로 C와 일치합니다.즉, OC의 대상은 메모리를 먼저 분배한 다음에 초기화하고 그 다음에 얻는 것이야말로 안심하고 조작할 수 있는 대상이다.이 과정에서 OC는 두 개의 함수를 제공했고 alloc와 init는 우리가 상응하는 조작을 완성하도록 했다.alloc의 역할은 두 가지가 있다. 하나는 메모리의 분배이다.또 하나는 메모리 정리다.메모리 정리에 대해 이야기할 때 누군가가 의혹을 일으킬 수 있다. alloc는 메모리 정리에 대해 0을 둔다. 그런데 왜 우리는 init가 필요합니까?이곳의 원인은 alloc의 메모리가 0을 설정했기 때문이다. 메모리를 대상으로 하는 실제 작업은 메모리에 저장된 것이다. 지난번에 이 메모리를 사용한 대상의 관련 내용을 비우는 것이다. 주요 목적은 현재 분배된 대상을 확보하는 것이다. 그 중의 일부 속성은 이전에 이 위치에 분배된 값의 영향을 받지 않는다는 것이다.여기서 알 수 있듯이 alloc는 초기화 문제를 고려하지 않고 초기화 작업을 init에 맡겼다. 이렇게 설계한 장점은 나도 잘 모르겠지만 이것은 함수의 결합성 요구에 부합된다.다음에 init를 말하자면 init의 주요 역할은 초기화이다. 그러면 C/C++에서 온 사람에게 init는 신기한 느낌을 준다. 왜냐하면 C/C++의 세계에서 초기화하려면 특히 클래스에 지침이 함유되어 있을 때 반드시 구조 함수에서 초기화를 해결해야 하기 때문이다.하지만 OC에서는 전혀 생각 안 해도 돼요. 그냥 init하면 돼요.여기서는 OC의 nil에 특수성이 존재하기 때문이다.바늘에 대해 init는 기본적으로 nil로 초기화되고 OC에서 nil은 빈 바늘이지만 메시지를 받아들일 수 있고 이상이 생기지 않기 때문에 OC에서는 이렇게 많은 걱정이 없다.
alloc도 init도 그들의 반환 유형은 모두 id이고 id는OC에서도 특수한 지위를 가진다.우선, id 자체가 하나의 바늘 유형이다. 이 말은 약간 빙빙 돌릴 수 있다. 주요 뜻은 우리가 바늘을 성명할 때 모두 별표를 붙여야 하지만 id 유형은 자체 별표를 가진 것과 같아서 우리는 별표의 문제를 더 이상 고려할 필요가 없다는 것이다.그 다음으로 id 형식은 모든 종류의 대상을 가리킬 수 있고 id 형식의 대상은 실제 메시지를 보낼 때 실행할 때 진정한 대상을 찾을 수 있다.단지 메시지를 잘못 보내면 프로그램이 틀릴 뿐이다.주의해야 할 것은 init가 되돌아오는 id 형식이 원래의 대상인지 확인할 수 없다는 것이다. 초기화는 새로 만든 대상을 되돌릴 수 있기 때문에 초기화할 때 바늘로 새로 만든 대상을 저장하지 않으면 얻은 대상이 초기화되지 않았을 가능성이 높다.예를 들어 아래의 이 코드는 문제가 있다.
NSObject *someObject = [NSObject alloc];
[someObject init];
클래스와 대상에 관해서는 사실 조금밖에 남지 않았다. 바로 OC가 우리를 위해 봉인해 놓은 것이다. 일련의 공장 방법이다. 우리는 자주 몇 가지 방법으로 명칭에 with를 가진 함수를 사용할 수 있다. 이런 함수를 호출하면 우리는 직접 대상을 얻을 수 있다. 이런 함수는 사실 이미 봉인된 공장 방법이다.공장 방법에 관해서는 스스로 알아볼 수 있지만, 사실 그리 많은 내용도 없다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.